package cn.edu.cug.cs.gtl.docsrv.img.dao;

import cn.edu.cug.cs.gtl.docsrv.img.catalog.CatalogTree;
import cn.edu.cug.cs.gtl.mybatis.mapper.img.ImgAll;
import cn.edu.cug.cs.gtl.mybatis.mapper.img.ImgCatalog;
import cn.edu.cug.cs.gtl.mybatis.mapper.img.ImgItem;
import cn.edu.cug.cs.gtl.protos.Document;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;

import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.List;

public interface ImgDao {

    /**
     服务名称：addImg
     功能描述：单个本地Img文件入库
     接口描述： /api/img/addImg
     传入参数：
     ImgAll  img；前端传入ImgAll的JSON对象
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    void addImg(ImgAll imgAll);


    /**
     服务名称：addImgs
     功能描述：多个本地IMG文件入库
     接口描述： /api/img/ addImgs
     传入参数：
     List<ImgAll>  imgs；前端传入ImgAll列表的JSON对象
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    void addImgs(List<ImgAll> ls);

    /**
     服务名称：addFromRawDB
     功能描述：从原始数据库中提取指定类型的图像文件入库
     接口描述： /api/img/addFromRawDB
     传入参数：
     String imgType   图像类型，文件后缀；
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    @Deprecated
    boolean addFromRawDB();

    /**
     服务名称：getImgByName
     功能描述：图像数据库中提取指定名称的图像文件
     接口描述： /api/img/getImgByName
     传入参数：
     String imgName   图像名称；
     返回值：
     List<ImgAll> imgAllList 的JSON字符串
     调用示例：
     */
    List<ImgAll> getImgByName(String imgName);

    /**
     服务名称：getImgByEnTitle
     功能描述：图像数据库中提取指定英文名称的图像文件
     接口描述： /api/img/ getImgByEnTitle
     传入参数：
     String enTitle ；
     返回值：
     List<ImgAll> imgAllList 的JSON字符串
     调用示例：
     */
    List<ImgAll> getImgByEnTitle(String enTitle);


    /**
     服务名称：getImgByCnTitle
     功能描述：图像数据库中提取指定中文名称的图像文件
     接口描述： /api/img/ getImgByCnTitle
     传入参数：
     String cnTitle ；
     返回值：
     List<ImgAll> imgAllList 的JSON字符串
     调用示例：
     */
    List<ImgAll> getImgByCnTitle(String cnTitle);



    /**
     服务名称：getImgByInternalId
     功能描述：图像数据库中提取指定ID的图像文件
     接口描述： /api/img/getImgByInternalId
     传入参数：
     long internalId；
     返回值：
     ImgAll  img     ; ImgAll的JSON字符串
     调用示例：
     */
    ImgAll getImgByInternalId(BigDecimal internalId);


    /**
     服务名称：getImgByBoundingBox
     功能描述：图像数据库中提取指定范围的图像
     接口描述： /api/img/getImgByBoundingBox
     传入参数：
     String bb；//minx,maxx,miny,maxy  数字之间逗号分隔
     String mask; //intersect 相交的图像； 或  contains 包含的图像
     返回值：
     List<ImgAll> imgAllList 的JSON字符串
     调用示例：
     */
    List<ImgAll> getImgByBoundingBox(Geometry g, String mask);

    /**
     服务名称：deleteImgByInternalId
     功能描述：删除图像数据库中指定ID的图像
     接口描述： /api/img/deleteImgByInternalId
     传入参数：
     long internalId；
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    boolean deleteImgByInternalId(BigDecimal internalId);





    /**
     服务名称：getImageByImgInternalId
     功能描述：图像数据库中提取指定Img的几何对象
     接口描述： /api/img/getImageByImgInternalId
     传入参数：
        long imgInternalId
     返回值：
        GeometryJSON的列表
     调用示例：
     */
    BufferedImage getImageByImgInternalId(BigDecimal imgInternalId);


    /**
     服务名称：getEnvelopeByImgInternalId
     功能描述：图像数据库中提取指定范围的几何对象
     接口描述： /api/img/getEnvelopeByImgInternalId
     传入参数：
     long imgInternalId
     返回值：
     Envelope
     调用示例：
     */
    Envelope getEnvelopeByImgInternalId(BigDecimal imgInternalId);


    /**
     服务名称：getImgCatalogs
     功能描述：图像数据库中提取所有分类
     接口描述： /api/img/getImgCatalogs
     传入参数：
     返回值：
     List<ImgCatalog> catalogs
     调用示例：
     */
    List<ImgCatalog> getImgCatalogs();


    /**
     服务名称：getDocumentByImgInternalId
     功能描述：图像数据库中提取指定Img文档
     接口描述： /api/img/getDocumentByImgInternalId
     传入参数：
        long imgInternalId
     返回值：
        Document doc;
     其中，每个Feature的GeoJSON字符串为Document的一个content；
     其他的不为空的字段为该Img文档的元数据。
     调用示例：
     http://localhost:8090/api/img/getDocumentByImgInternalId?imgInternalId=3
     */
    Document getDocumentByImgInternalId(BigDecimal imgInternalId);


    List<ImgAll> getImgByCatalogInternalId(BigDecimal catalogInternalId);


    /**
     * 将所有的目录整理成一个树后返回
     * @return
     */
    CatalogTree getCatalogTree();

    List<BigDecimal> getImgInternalIdsByCatalogInternalId(BigDecimal catalogId);
}
